#include <QApplication>
#include "mainwindow.h"
#include "unifiedcachemanager.h"
#include "crashhandler.h"
#include "pathmanager.h"
#include <QScreen>
#include <QLoggingCategory>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QThreadPool>
#include <QDir>
#include <iostream>

#ifdef _WIN32
#include <windows.h>
#endif

int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN
    // Windows 高 DPI 支持 - 必须在创建 QApplication 之前设置
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif
    
    QApplication app(argc, argv);
    
    // 设置应用程序信息（必须在QSettings使用前设置）
    // 这些信息用于确定配置文件的保存位置
    app.setOrganizationName("LoimReader");
    app.setOrganizationDomain("loimreader.com");
    app.setApplicationName("LimeReader");
    
    
    // 设置应用程序在最后一个窗口关闭时退出
    app.setQuitOnLastWindowClosed(true);

    // 安装崩溃处理器 - 必须在应用程序初始化后立即安装
    CrashHandler::install();

    // 使用PathManager获取标准日志目录和路径
    QString logDir = PathManager::getLogDirectory();
    QString logPath = PathManager::getDebugLogPath();

    // 确保日志目录存在
    PathManager::ensureDirectoryExists(logDir);

    // 清空debug.log文件（每次启动重新开始）
    QFile::remove(logPath);

    // 输出路径信息到控制台（用于调试）
    std::cout << "=== LongImageReader 启动信息 ===" << std::endl;
    std::cout << "日志目录: " << logDir.toStdString() << std::endl;
    std::cout << "日志文件: " << logPath.toStdString() << std::endl;
    PathManager::logAllPaths(); // 输出所有路径信息
    
    // 显示QSettings保存位置
    QSettings testSettings;
    std::cout << "\n=== QSettings 配置信息 ===" << std::endl;
    std::cout << "配置文件路径: " << testSettings.fileName().toStdString() << std::endl;
    std::cout << "组织名称: " << testSettings.organizationName().toStdString() << std::endl;
    std::cout << "应用名称: " << testSettings.applicationName().toStdString() << std::endl;
#ifdef Q_OS_WIN
    std::cout << "Windows: 配置保存在注册表或ini文件" << std::endl;
#elif defined(Q_OS_MACOS)
    std::cout << "macOS: 配置保存在 ~/Library/Preferences/" << std::endl;
#else
    std::cout << "Linux: 配置保存在 ~/.config/" << std::endl;
#endif
    std::cout << "=== 启动信息结束 ===" << std::endl;

#ifndef QT_NO_DEBUG_OUTPUT
    // 仅在Debug模式下安装自定义消息处理器，输出所有调试信息到标准日志目录下的debug.log
    // Release模式下qDebug会被编译器完全移除，不需要消息处理器
    static QString staticLogPath = logPath; // 将路径存储为静态变量
    qInstallMessageHandler([](QtMsgType type, const QMessageLogContext &context, const QString &msg) {
        // 移除所有过滤条件，输出所有调试信息
        QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
        QString logMessage = QString("[%1] %2\n").arg(timestamp).arg(msg);

        // 写入固定路径的日志文件
        QFile logFile(staticLogPath);
        if (logFile.open(QIODevice::WriteOnly | QIODevice::Append)) {
            QTextStream logStream(&logFile);
            logStream << logMessage;
            logStream.flush();
        }
    });
    std::cout << "日志系统已启用 (Debug模式)" << std::endl;
#else
    std::cout << "日志系统已禁用 (Release模式 - qDebug已移除)" << std::endl;
#endif

    // 设置应用程序图标
#ifdef Q_OS_WIN
    // Windows 使用 .ico 图标
    QIcon icon(":/icons/windows.ico");
    app.setWindowIcon(icon);
#elif !defined(Q_OS_MACOS)
    // Linux 等其他平台使用 PNG 图标
    QIcon icon(":/icons/app.png");
    app.setWindowIcon(icon);
#endif
    // macOS 使用 Bundle 图标（macos.icns），不需要手动设置

    // 创建和显示主窗口
    MainWindow* window = new MainWindow();
    window->show();

    // 清除缓存（简化版本）
    UnifiedCacheManager* cacheManager = UnifiedCacheManager::instance();
    if (cacheManager) {
        cacheManager->clearAllCache();
    }

    return app.exec();
}